package ru.mirent;

import org.junit.jupiter.api.Test;

import java.util.ArrayList;
import java.util.List;

import static org.mockito.Mockito.*;

/**
 * Пример создания mock и spy объектов и их вызов
 */
public class MockAndStyExampleTest {

    /**
     * Создание mock-объекта, необходимо определеить поведение для вызываемого метода
     */
    @Test
    void mockTest() {
        // Объект mock создается для класса
        List<String> listMock = mock(List.class);
        when(listMock.size()).thenReturn(8);

        listMock.add("el1");
        listMock.add("el2");

        System.out.println("Вызов mock-метода с результатом: " + listMock.size());
    }

    /**
     * Создание spy-объекта для экземпляра класса, переопределение происходит при необходимости получить требуемый
     * результат
     */
    @Test
    void spyTest() {
        List<String> list = new ArrayList<>();
        // Объект spy создается для экземпляра класса
        List<String> spyMock = spy(list);

        // Наполнение объекта реальными значениями
        spyMock.add("el1");
        spyMock.add("el2");
        System.out.println("Вызов реального spy-метода с результатом: " + spyMock.size());

        // Переопределение одного из методов
        when(spyMock.size()).thenReturn(8);
        System.out.println("Вызов переопределенного spy-метода с результатом: " + spyMock.size());
    }
}
